package com.czk.server;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 模拟redis服务端接收redis-cli发送的数据
 * 看到这里，隐隐约约看到了刚才输入的几个关键字，但是还有一些其他的字符，要怎么解释呢，是时候让我对协议报文中的格式进行一下揭秘了。
 * <p>
 * 我对小弟们说了，对大哥说话的时候得按规矩来，这样吧，你们在请求的时候要遵循下面的规则：
 * <p>
 * *<参数数量> CRLF
 * $<参数1的字节长度> CRLF
 * <参数1的数据> CRLF
 * $<参数2的字节长度> CRLF
 * <参数2的数据> CRLF
 * ...
 * $<参数N的字节长度> CRLF
 * <参数N的数据> CRLF
 * 首先解释一下每行末尾的CRLF，转换成程序语言就是\r\n，也就是回车加换行。看到这里，你也就能够明白为什么控制台打印出的指令是竖向排列了吧。
 * <p>
 * 在命令的解析过程中，set、key1、value1会被认为是3个参数，因此参数数量为3，对应第一行的*3。
 * <p>
 * 第一个参数set，长度为3对应$3；第二个参数key1，长度为4对应$4；第三个参数value1，长度为6对应$6。在每个参数长度的下一行对应真正的参数数据。
 *
 * @Author:ChenZhangKun
 * @Date: 2021/6/22 16:10
 */
public class ServerSimulation {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(6379);
        // 接收数据
        Socket socket = serverSocket.accept();
        // 拿到输入流
        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        while (inputStream.read(bytes) != 0) {
            /**
             * *1
             * $7
             * COMMAND
             */
            System.out.println(new String(bytes));
        }
    }
}
